package info

import (
	"encoding/json"
	"strconv"
	"time"

	"github.com/yusufpapurcu/wmi"
	"gopkg.in/ini.v1"
)

type Win32_BIOS struct {
	BiosCharacteristics            []int32   `json:"系统支持的BIOS特征数组"` //uint16出错
	BIOSVersion                    []string  `json:"BIOS信息的数组"`
	BuildNumber                    string    `json:"编译的内部标识符"`
	Caption                        string    `json:"说明"`
	CodeSet                        string    `json:"代码集"`
	CurrentLanguage                string    `json:"语言名称"`
	Description                    string    `json:"描述"`
	EmbeddedControllerMajorVersion uint8     `json:"嵌入式控制器固件的主版本"`
	EmbeddedControllerMinorVersion uint8     `json:"嵌入式控制器固件的次版本"`
	IdentificationCode             string    `json:"制造商标识符"`
	InstallableLanguages           uint16    `json:"安装的语言数"`
	InstallDate                    time.Time `json:"安装时间"`
	LanguageEdition                string    `json:"语言版本"`
	ListOfLanguages                []string  `json:"安装语言名称数组"`
	Manufacturer                   string    `json:"造商名称"`
	Name                           string    `json:"名称"`
	OtherTargetOS                  string    `json:"制造商和操作系统类型"`
	PrimaryBIOS                    bool      `json:"是否为主BIOS"`
	ReleaseDate                    time.Time `json:"SMBIOS发布日期"`
	SerialNumber                   string    `json:"序列号"`
	SMBIOSBIOSVersion              string    `json:"BIOS版本"`
	SMBIOSMajorVersion             uint16    `json:"SMBIOS主版本号"`
	SMBIOSMinorVersion             uint16    `json:"SMBIOS次版本号"`
	SMBIOSPresent                  bool      `json:"是否可用"`
	SoftwareElementID              string    `json:"软件标识符"`
	SoftwareElementState           uint16    `json:"软件元素状态"`
	Status                         string    `json:"状态"`
	SystemBiosMajorVersion         uint8     `json:"BIOS的主版本"`
	SystemBiosMinorVersion         uint8     `json:"BIOS的次版本"`
	TargetOperatingSystem          uint16    `json:"目标操作系统"`
	Version                        string    `json:"版本"`
}

func BiosInfo() (bios []Win32_BIOS, err error) {
	err1 := wmi.Query("Select * from Win32_BIOS", &bios)
	if err1 != nil {
		return nil, err1
	}

	return bios, nil
}

func JsonBiosInfo() (t []byte, err error) {
	bios, err := BiosInfo()
	if err != nil {
		return t, err
	}
	t, jsonerr := json.Marshal(bios)
	if jsonerr != nil {
		return t, jsonerr
	}
	return t, nil
}
func MapJsonBiosInfo() (data []map[string]interface{}, err error) {

	info, err := BiosInfo()
	if err != nil {
		return data, err
	}

	t, err := json.Marshal(info)
	if err != nil {
		return data, err
	}
	//fmt.Printf("%v", string(t))
	json.Unmarshal(t, &data)
	cfg, err1 := ini.Load("./info/biosconfig.ini")
	if err1 != nil {
		return data, err
	}
	list := []string{"系统支持的BIOS特征数组", "软件元素状态", "目标操作系统"}
	for _, v := range data {
		for _, vl := range list {
			switch v[vl].(type) {
			case float64:
				v[vl] = cfg.Section(cfg.Section("").Key(vl).String()).Key(strconv.Itoa(int(v[vl].(float64)))).String()
			case []interface{}:
				valstring := []string{}
				for _, v2 := range v[vl].([]interface{}) {
					vs := v2.(float64)
					valstring = append(valstring, cfg.Section(cfg.Section("").Key(vl).String()).Key(strconv.Itoa(int(vs))).String())
				}
				v[vl] = valstring

			}
			if a, ok := v[vl].(float64); ok {
				v[vl] = cfg.Section(cfg.Section("").Key(vl).String()).Key(strconv.Itoa(int(a))).String()
			} else {
				continue
			}

		}
		//fmt.Println(cfg.Section(d.String()).Key(fmt.Sprintf("%v", v1)))
	}
	return data, nil
}
